package myutils

import (
	"cybeego/models"
	"strconv"
	"sync"
	"time"

	"github.com/astaxie/beego"
	"github.com/astaxie/beego/logs"
	"github.com/astaxie/beego/orm"
	"github.com/astaxie/beego/toolbox"
)

func init() {
	logs.Info("job init is running !")
	o := orm.NewOrm()
	var task []models.Task
	o.QueryTable("task").All(&task)
	for i, pl := range task {
		logs.Debug("task id", i)
		logs.Debug("task Content", pl.Content)

		// Add函数内容复制

	}

	// o := orm.NewOrm()
	var domain []models.Domain
	o.QueryTable("domain").All(&domain)

}
func InitTask() {
	logs.Info("job InitTask is running !")
	o := orm.NewOrm()

	var task []models.Task
	o.QueryTable("task").All(&task)
	for i, pl := range task {
		logs.Debug("task id", i)
		logs.Debug("task Content", pl.Content)
		AddTask("default", pl.Content, "default")
	}

}

func AddTask(cronname string, crontime string, crontfunc string) bool {
	if cronname == "" || crontime == "" || crontfunc == "" {
		logs.Error("MyTask 参数不能为空 ")
		return false
	}
	logs.Info("Cron Express:" + crontime) //
	if crontfunc == "default" {
		tk := toolbox.NewTask(cronname, crontime, CheckDueTime)
		tk.Run() //这个run会立即执行，不管定时多久，也许你的任务耗时颇久，使用这个函数你就无法做到类似异步的操作了。

		toolbox.AddTask(cronname, tk)
		toolbox.StartTask() //真真切切定时执行。
		return true
	} else {
		logs.Info(cronname, "没有响应的执行函数", crontfunc)
		return false
	}

}

// 暂停定时任务
func DelTask(cronname string) bool {
	if cronname == "" {
		logs.Info(" StopTask 收到参数 cronname 为空：", cronname)
		return false
	}
	toolbox.DeleteTask(cronname)
	logs.Info("DelTask is Del:", cronname)
	return true
}

// 定时任务貌似无法传参 此函数暂时不可用
func CheckDueTimeID(domainid string, crontabtime string) bool {
	if domainid == "" || crontabtime == "" {
		logs.Info("CheckDueTime日志 domainid 或者 crontabtime 为空")
		SendMail("邮箱地址", "称谓", "标题", "内容")
		return false
	}
	logs.Info("CheckDueTime日志 check domainid :", domainid)

	return true
}

func CheckDueTime() error {
	local, _ := time.LoadLocation("Local")
	timevar, _ := time.ParseInLocation("2006-01-02 15:04:05", "2017-10-23 15:01:01", local)
	// timef, _ := time.ParseInLocation("2006-01-02 15:04:05", "2023-10-23 15:01:01", local)
	logs.Debug("测试用的时间：", timevar)

	logs.Error("定时任务 CheckDueTime start:%v", time.Now())
	time.Sleep(time.Second * 1)

	o := orm.NewOrm()
	var domains []models.Domain
	o.QueryTable("domain").All(&domains)

	for i, pl := range domains {
		logs.Debug("---CheckDueTime i  ", i)
		logs.Debug("---CheckDueTime pl  ", pl.DueTime)
		// timepl := time.Parse("2006-01-02 15:04:05", pl[0])
		res := CTime(pl.DueTime)
		if res {
			content := "定时任务邮件内容：有域名过期了，详细情况是：" + "<br/>" + "IDis:" + strconv.Itoa(pl.Id) + "<br/>" + "Titleis:" + pl.Title
			SendMail(
				"xueliang.liu@chuanyangtech.com",
				"liuxiansheng",
				"标题：域名过期,ID为："+strconv.Itoa(pl.Id),
				content)
		} else {
			SendMail("xueliang.liu@chuanyangtech.com", "liuxiansheng", "标题：域名一切正常", "定时任务邮件内容：域名任务执行完毕，一切域名正常")

		}

	}

	logs.Error("定时任务 CheckDueTime end:%v", time.Now())
	return nil
}

func CTime(timevar2 time.Time) bool {
	now := time.Now()
	logs.Debug(now)
	// local, _ := time.LoadLocation("Local")
	// oldtime, _ := time.ParseInLocation("2006-01-02 15:04:05", "2017-10-23 15:01:01", local)
	// futuretime, _ := time.ParseInLocation("2006-01-02 15:04:05", "2023-10-24 15:05:01", local)
	timevar := timevar2
	logs.Debug(timevar)
	logs.Debug(timevar, timevar.After(now))
	if timevar.Before(now) {
		logs.Debug(timevar, timevar.Before(now))
		return true
	} else {
		return false
	}

}

// 历史测试函数
var TimerWg sync.WaitGroup

func GetValue() string {
	return "Hello from this another package"
}

func generateWarning() error {

	logs.Error("定时任务hello time start:%v", time.Now())
	time.Sleep(time.Second * 5)
	logs.Error("定时任务hello time end:%v", time.Now())
	return nil
}

func MySyncTask() {
	TimerWg = sync.WaitGroup{}
	TimerWg.Add(1) // 次数
	logs.Debug("start :%v", time.Now())
	tk := toolbox.NewTask("generateWarning", "0/30 * * * * * ", generateWarning)
	tk.Run()
	toolbox.AddTask("generateWarning", tk)
	toolbox.StartTask()
	logs.Debug("StartTask :%v", time.Now())
	// 注释之后会继续执行但是会报错：panic: sync: negative WaitGroup counter
	// defer toolbox.StopTask()
	TimerWg.Wait()
	logs.Debug("Wait :%v", time.Now())
	defer TimerWg.Done() // 这个Done和 Wait分开了 不好搞

}

func EchoError() error {
	// defer TimerWg.Done()
	logs.Error("定时任务 EchoError start sendmail :%v", time.Now())
	time.Sleep(time.Second * 1)
	// MySendMail()
	// ccList := make([]string, 0)
	// ccList := []string{}
	// SendMail("xueliang.liu@chuanyangtech.com", "liuxiansheng", "定时任务邮件标题", "定时任务邮件内容", ccList)
	SendMail("xueliang.liu@chuanyangtech.com", "liuxiansheng", "定时任务邮件标题", "定时任务邮件内容")
	logs.Error("定时任务 EchoError end sendmail :%v", time.Now())
	return nil
}

func MyTestTask() {

	cronExpress := beego.AppConfig.String("xxxxx.xxxxx")
	if cronExpress == "" {
		// cronExpress = "* * */1 * * *" //一个小时执行一次 参考底部注释
		cronExpress = "0 */30 * * * *" //三十分分钟执行一次 参考底部注释
	}
	logs.Info("Cron Express:" + cronExpress) //
	tk1 := toolbox.NewTask("mytask", cronExpress, CheckDueTime)
	tk1.Run() //这个run会立即执行，不管定时多久，也许你的任务耗时颇久，使用这个函数你就无法做到类似异步的操作了。

	toolbox.AddTask("mytask", tk1)
	toolbox.StartTask() //真真切切定时执行。

}

//前6个字段分别表示：
//       秒钟：0-59
//       分钟：0-59
//       小时：1-23
//       日期：1-31
//       月份：1-12
//       星期：0-6（0 表示周日）

//还可以用一些特殊符号：
//       *： 表示任何时刻
//       ,：　表示分割，如第三段里：2,4，表示 2 点和 4 点执行
//　　    －：表示一个段，如第三端里： 1-5，就表示 1 到 5 点
//       /n : 表示每个n的单位执行一次，如第三段里，*/1, 就表示每隔 1 个小时执行一次命令。也可以写成1-23/1.
/////////////////////////////////////////////////////////
//    0/30 * * * * *                        每 30 秒 执行
//    0 43 21 * * *                         21:43 执行
//    0 15 05 * * * 　　                     05:15 执行
//    0 0 17 * * *                          17:00 执行
//    0 0 17 * * 1                          每周一的 17:00 执行
//    0 0,10 17 * * 0,2,3                   每周日,周二,周三的 17:00和 17:10 执行
//    0 0-10 17 1 * *                       毎月1日从 17:00 到 7:10 毎隔 1 分钟 执行
//    0 0 0 1,15 * 1                        毎月1日和 15 日和 一日的 0:00 执行
//    0 42 4 1 * * 　 　                     毎月1日的 4:42 分 执行
//    0 0 21 * * 1-6　　                     周一到周六 21:00 执行
//    0 0,10,20,30,40,50 * * * *　           每隔 10 分 执行
//    0 */10 * * * * 　　　　　　              每隔 10 分 执行
//    0 * 1 * * *　　　　　　　　               从 1:0 到 1:59 每隔 1 分钟 执行
//    0 0 1 * * *　　　　　　　　               1:00 执行
//    0 0 */1 * * *　　　　　　　               毎时 0 分 每隔 1 小时 执行
//    0 0 * * * *　　　　　　　　               毎时 0 分 每隔 1 小时 执行
//    0 2 8-20/3 * * *　　　　　　             8:02,11:02,14:02,17:02,20:02 执行
//    0 30 5 1,15 * *　　　　　　              1 日 和 15 日的 5:30 执行
